데이터 거래란 무엇인가요?

단일 엔드포인트로 모든 클라이언트의 요청을 처리하기 위한 개념을 확인

QCN

HandStack에서 '거래'란?

  • 출발지와 도착지 간에 데이터를 주고받는 작업의 기본 단위를 의미합니다.

  • 다양한 시스템 구성 요소 간의 데이터 흐름을 '거래'라고 부릅니다.

    • 클라이언트에서 업무 서버로 데이터를 요청하고 응답받는 거래
    • 업무 서버에서 메시지 서버로 작업을 전달하는 거래
    • 메시지 서버에서 데이터베이스로 데이터를 CRUD하는 거래
    • 메시지 서버에서 외부 서비스 API를 호출하는 거래
QCN

거래를 위한 약속, '계약'

  • 화면에서 업무 거래를 위해 클라이언트와 서버는 약속된 규칙을 따라야 합니다.

  • 이 약속을 '계약(Contract)'이라고 부릅니다.

  • 계약에는 어떤 데이터를 주고받을 것인지(입력/출력 정보) 명확하게 정의되어 있습니다.

  • 계약은 transact 모듈의 업무와 dbclient, function, command 모듈의 기능으로 만들어집니다.

QCN

dbclient 모듈 주요 역할

  • transact 요청 정보로 SQL Server, Oracle, MySQL & MariaDB, PostgreSQL, SQLite 데이터베이스의 CRUD 쿼리를 수행합니다.
  • 업무 프로젝트에서 대부분의 90% 업무는 데이터베이스의 CRUD 쿼리입니다.
QCN

dbclient 모듈의 xml 기능 계약 파일

<?xml version="1.0" encoding="UTF-8"?>
<mapper xmlns="contract.xsd">
	<header>
		<application>HDS</application>
		<project>TST</project>
		<transaction>TST010</transaction>
		<datasource>DB01</datasource>
		<use>Y</use>
		<desc>사용자, 이메일, 연락처 2FA 인증 관리</desc>
	</header>
	<commands>
		<statement id="LD01" seq="0" use="Y" timeout="0" desc="인증 정보 조회">
			<![CDATA[
SELECT C.*
FROM   Certify C
WHERE  C.CertifiedYN = 'N'
	AND C.VerifyTarget = @VerifyTarget
	AND C.ExpiredAt > GETDATE();
			]]>
			<param id="@VerifyTarget" type="String" length="1" value="" />
		</statement>
	</commands>
</mapper>
QCN

function 모듈 주요 역할

  • transact 요청 정보로 C#, Node.js, Python 언어의 스크립트를 수행합니다.
  • 업무 프로젝트에서 10% 업무는 내/외부 시스템 연동, 배치 프로그램 수행, 정기 작업 실행입니다.
QCN

function 모듈의 C# 기능 featureMain.cs 파일

namespace HDS.Function.TST
{
    public class CSF010
    {
        protected DataSet? GF01(List<DynamicParameter> dynamicParameters, DataContext dataContext)
        {
            string typeMember = "TST.CSF010.GF01";

            string serverDate = dynamicParameters.Value("ServerDate").ToStringSafe();
            string serverName = dynamicParameters.Value("ServerName").ToStringSafe();

            DataTableHelper dataTableBuilder = new DataTableHelper();
            dataTableBuilder.AddColumn("FunctionResult", typeof(string));

            dataTableBuilder.NewRow();
            dataTableBuilder.SetValue(0, 0, $"typeMember: {typeMember}, serverDate: {serverDate}, serverName: {serverName}");

            using DataSet result = new DataSet();
            using (DataTable table = dataTableBuilder.GetDataTable())
            {
                result.Tables.Add(table);
            }

            return result;
        }
    }
}
QCN

function 모듈의 Node.js 기능 featureMain.js 파일

var fs = require('fs');
var syn = require('syn');

module.exports = {
    GF01: (callback, moduleID, parameters, dataContext) => {
        var typeMember = "TST.JSF010.GF01";
        var serverDate = $array.getValue(parameters, 'ServerDate');
        var serverName = $array.getValue(parameters, 'ServerName');

        var result = {
            DataTable1: [
                {
                    FunctionResult: `typeMember: ${typeMember}, moduleID: ${moduleID}, 
                    serverDate: ${serverDate}, serverName: ${serverName}`
                }
            ]
        };

        callback(null, result);
    }
}
QCN

function 모듈의 Python 기능 featureMain.py 파일

import json

class PYF010:
    def GF01(parameters, dataContext):
        print(parameters["GlobalID"])
        print(dataContext)
        
        dataDict = json.loads(dataContext)

        result = {
            "DataTable1": [
                {
                    "accessToken": dataDict["accessToken"],
                    "globalID": dataDict["globalID"],
                    "environment": dataDict["environment"],
                    "platform": dataDict["platform"]
                }
            ]
        }

        return json.dumps(result, ensure_ascii=False, indent=4)
QCN

command 모듈 주요 역할

  • transact 요청 정보로 배치 스크립트 또는 bash 스크립트와 연계하여 운영체제 내에서 CLI 명령 프로그램을 수행합니다.
  • 안전한 대량의 배치 작업이나 외부 시스템과의 연동에 사용합니다.
  • 개발이 진행 중입니다.
QCN

command 모듈의 xml 기능 계약 파일

<?xml version="1.0" encoding="UTF-8"?>
<mapper xmlns="contract.xsd">
    <header>
        <application>HDS</application>
        <project>ZZD</project>
        <transaction>TST010</transaction>
        <datasource>DB01</datasource>
        <program>TST010</program>
        <use>Y</use>
        <desc>배치 작업 프로그램 테스트</desc>
    </header>
    <commands>
        <statement id="GC01" seq="0" use="Y" timeout="0" before="HDS|SMP|SMP040|GD01" 
        after="HDS|SMP|SMP040|MD01" 
        fallback="HDS|SMP|SMP040|AF01">
            <beforescript>
                dotnet --version
                node -v
            </beforescript>
            <afterscript>
                node -v
            </afterscript>
            <param id="@ApplicationID" type="Int32" length="-1" value="NULL" />
            <param id="@BusinessID" type="Int32" length="-1" value="NULL" />
            <param id="@CodeGroupID" type="String" length="36" value="NULL" />
        </statement>
    </commands>
</mapper>
QCN

데이터 응답 결과의 주요 특징

  • C#, Node.js, Python 코드 언어별로 구현 방식은 다르지만 반환 결과는 본질적으로 구조화된 테이블 형태의 데이터를 표현하고 전달하기 위한 메커니즘이라는 공통점을 가집니다.
  • 반환 결과는 테이블 형태의 데이터를 나타내기 위한 일종의 약속된 데이터 구조 또는 패턴으로 사용됩니다.
  • 모든 언어에서 궁극적으로 행(Row)과 열(Column)으로 구성된 2차원적인 테이블 구조를 나타내야 합니다.
QCN

여러 데이터 거래 연동

...
"SequentialOption": [
    {
        "TransactionProjectID": "SMP",
        "TransactionID": "SMP010",
        "ServiceID": "GD04",
        "CommandType": "D",
        "ServiceInputFields": [ 0 ],
        "ServiceOutputs": [
            {
                "ModelID": "Dynamic",
                "Fields": [
                ],
                "Type": "Form"
            }
        ],
        "ResultHandling": "FieldMapping",
        "TargetInputFields": [ 0 ],
        "ResultOutputFields": []
    },
    {
        "TransactionProjectID": "SMP",
        "TransactionID": "SMP010",
        "ServiceID": "IF01",
        "CommandType": "F",
        "ServiceInputFields": [ 0 ],
        "ServiceOutputs": [
            {
                "ModelID": "Dynamic",
                "Fields": [
                ],
                "Type": "Form"
            }
        ],
        "ResultHandling": "ResultSet",
        "TargetInputFields": [],
        "ResultOutputFields": [ 0 ]
    }
],
...
QCN

요약 정리 및 Q&A

  • 거래: 출발지와 도착지 간의 데이터 교환 작업 단위
  • 계약: 거래를 위해 미리 정의된 입력/출력 데이터 약속
  • 단일 엔드포인트: 모든 거래 요청을 처리하는 단일 창구
  • 모듈: 계약에 따라 dbclient, function, command 등이 실제 작업을 수행
QCN